/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package core;

import com.sun.lwuit.Display;
import com.sun.lwuit.Font;
import com.sun.lwuit.Image;
import com.sun.lwuit.Label;
import com.sun.lwuit.TextField;
import com.sun.lwuit.plaf.UIManager;
import com.sun.lwuit.util.Resources;
import java.util.Hashtable;
import javax.microedition.midlet.MIDlet;
import network.Connection;
import network.PacketBuilder;
import network.packets.Packet;
import view.MainForm;
import view.StartMenu;
import view.additional.CompletedOrderListRenderer;
import view.additional.MenuList;

//В OrdersListForm удалил deletedOrder
//[IMAP.Net.SettingXml]size=2035
//[IMAP.Net.InnerNamespace.GetOrders_answer]size=1787(3 orders)
//
//if ("wtk-emulator".equals(System.getProperty("device.model")))
// 
////Строка(и массивы) проверка на нулл - обсудить
////Так и не показывается очередь заказов на главной(ее надо в пакеты подобавлять + пакет изменения очереди)
//com.nokia.mid.ui.DeviceControl.setLights(0, 100); раскоментировать при сборке
////Все ToDo Kvest
////Все с багтрекера
//
////Может ли приходить пакет отмены и т.д. для предварительных заказов? Если да - в событиях учесть!
//
////Подумать как контролировать количество взятых заказов
//
////Как отображать заголовок формы заказов для отмененных,пропущенных и т.д. заказов?
//
////Уменьшить расстояние между элементами списка?
////Возможно удалить ИП серва из свойств приложения
////Проблема с регулятором громкости при смене темы - исчезает при перезапуске приложения

/**
 *
 * @author Kvest
 */
public class IMAPMIDlet extends MIDlet
{
    private static final String RESOURCE_FILE = "/IMAP.res"; 
    private static final String LANGUAGE_L10N_NAME = "taxi";
    private static final String LANGUAGE_NAME = "ru";
    private static final String DIGITS_IMAGE = "digits";
    private static final String EFIR_IMAGE = "efir";
    private static final String PRELIM_IMAGE = "prelim";
    private static final String CURRENT_IMAGE = "current";
    private static final String COMPLETE_IMAGE = "complete";
    private static final String ICONS_IMAGE = "icons";
    
    private static IMAPMIDlet midlet;
    public static IMAPMIDlet getMidlet()
    {
        return midlet;
    }
    
    Hashtable dayTheme, nightTheme;
    
    private PositionManager positionManager;
    private MessageManager messageManager;
    private OrderManager orderManager;
    private RuntimeData runtimeData;
    private boolean pause = false;
    
    public IMAPMIDlet()
    {     
        pause = false;
        
        //Инициализируем визуальную библиотеку
        Display.init(this);
        Display.getInstance().setThirdSoftButton(true);
        
        positionManager = new PositionManager();
        messageManager = new MessageManager();
        messageManager.setMaxMessagesdCount(getMaxMessagesCount());
        orderManager = new OrderManager();
        runtimeData = new RuntimeData();
        //Чтоб зпгрузилось
        NotificationManager.getNotificationManager();
    }
    
    public void startApp()
    {
        if (pause)
        {
            return;
        }
        
        midlet = this;
        
        //Устанавливаем тему отображения компонентов
        try
        {
            Resources r = Resources.open(RESOURCE_FILE);
            dayTheme = r.getTheme(Settings.THEME_DAY);
            nightTheme = r.getTheme(Settings.THEME_NIGHT);
            setFont();
            Hashtable localize = r.getL10N(LANGUAGE_L10N_NAME, LANGUAGE_NAME);
            UIManager.getInstance().setResourceBundle(localize);
            
            MenuList.setDigits(r.getImage(DIGITS_IMAGE));
            MainForm.setEfirIcon(r.getImage(EFIR_IMAGE));
            MainForm.setPrelimIcon(r.getImage(PRELIM_IMAGE));
            MainForm.setCurrentIcon(r.getImage(CURRENT_IMAGE));
            MainForm.setCompleteIcon(r.getImage(COMPLETE_IMAGE));
            Image icons = r.getImage(ICONS_IMAGE);
            MainForm.setIconsIcon(icons);
            CompletedOrderListRenderer.setCancaledIcon(icons.subImage(MainForm.ICONS_SIZE * 2, 0, MainForm.ICONS_SIZE, MainForm.ICONS_SIZE, true));
        }catch (Exception e) {}
        
        //Устанавливаем тему
        setTheme();
        
        //Регистрируем руские раскладки клавиатуры
        registerRussionKeyboard();
        
        registerNetworkNotifiers();
        
        //Показываем первый экаран
        ScreenEngine.getEngine().push(new StartMenu());
    }
    
    public void setTheme()
    {
        if (Settings.getSettings().getTheme().equals(Settings.THEME_DAY))
        {
            UIManager.getInstance().setThemeProps(dayTheme);
        }
        else if (Settings.getSettings().getTheme().equals(Settings.THEME_NIGHT))
        {
            UIManager.getInstance().setThemeProps(nightTheme);
        }
    }
    
    public void pauseApp() 
    {
        pause = true;
    }

    public void destroyApp(boolean unconditional)
    {
        //Сохраняем данные
        messageManager.save();
        orderManager.save();
        
        notifyDestroyed();
    }

    public PositionManager getPositionManager() 
    {
        return positionManager;
    }

    public MessageManager getMessageManager()
    {
        return messageManager;
    }

    public OrderManager getOrderManager() 
    {
        return orderManager;
    }

    public RuntimeData getRuntimeData() 
    {
        return runtimeData;
    }
    
    public String getServerIp() {
       String result = getAppProperty("serverip");
        if (result == null)
        {
            result = "";
        }
        
        return result; 
    }
    
    public String getExtraServerIp() {
        String result = getAppProperty("extra_serverip");
        if (result == null)
        {
            result = "";
        }
        
        return result;
    }
    
    public int getMaxMessagesCount() {
        try {
            return Integer.parseInt(getAppProperty("max_messages"));
        } catch (Exception e) {
            return MessageManager.DEFAULT_MAX_MESSAGES_COUNT;
        }
    }
    
    public String getMidletVersion()
    {
        return getAppProperty("MIDlet-Version");
    }
    
    public String getDispLifeNumber()
    {
        String result = getAppProperty("disp_life");
        if (result == null)
        {
            result = "";
        }
        
        return result;
    }
    
    public String getDispMTSNumber()
    {
        String result = getAppProperty("disp_mts");
        if (result == null)
        {
            result = "";
        }
        
        return result;
    }
    
    public String getDispKievstarNumber()
    {
        String result = getAppProperty("disp_kievstar");
        if (result == null)
        {
            result = "";
        }
        
        return result;
    }
    
    public void setFont()
    {
        Font font = Font.createSystemFont(Font.FACE_SYSTEM, 
                                          (Settings.getSettings().isFontBold() ? Font.STYLE_BOLD : Font.STYLE_PLAIN), 
                                          Settings.getSettings().getFontSize());
        dayTheme.put("font", font);
        nightTheme.put("font", font);

        //Display.getInstance().getCurrent().refreshTheme();
    }
    
    private void registerNetworkNotifiers()
    {
        Connection.getConnection().setConnectionNotifier(new Connection.ConnectionNotifier() 
        {
            public void connectionEstablished() 
            {
                //Остановить таймер реконекта
                Connection.getConnection().stopReconnectTimer();

                //Отправляем пакет логина
                Connection.getConnection().send(PacketBuilder.createLogin(255, Settings.getSettings().getLogin(), 
                                                                          Settings.getSettings().getPassword(), true));
            }

            public void onReconnectFailed() {
                //Запрашиваем подключение к резервному
                ScreenEngine.getEngine().confirmConnectToExtraIP();
            }

            public void onReconnectToExtraFailed() {
                //Выводим сообщение об ошибке
                ScreenEngine.getEngine().showMessageBox("error", (new Label("connection_error")).getText(),-1);
            }
        });
        
        Connection.getConnection().setPacketListener(Packet.PING_RESPONCE, new Connection.PacketNotifier()
        {
            public void incomingPacket(Packet packet) 
            {
                Connection.getConnection().send(PacketBuilder.createPingAnswer());
            } 
        }); 
//        Connection.getConnection().setPacketListener(Packet., new Connection.PacketNotifier()
//        {
//            public void incomingPacket(Packet packet) 
//            {
//                
//            } 
//        });
    }
    
    public static void registerRussionKeyboard()
    {
        final String[] LOWER_CASE_KEY_CODES = {
            // 0
            " +0",
            // 1
            ".,?!'\"1-()@/:_",
            // 2
            //"\u05d3\u05d4\u05d52",
            "абвг",
            // 3
            //"\u05d0\u05d1\u05d23",
            "дежз",
            // 4
            //"\u05de\u05dd\u05e0\u05df4",
            "ийкл",
            // 5
            //"\u05d9\u05db\u05da\u05dc5",
            "мноп",
            // 6
            //"\u05d6\u05d7\u05d86",
            "рсту",
            // 7
            //"\u05e8\u05e9\u05ea7",
            "фхцч",
            // 8
            //"\u05e6\u05e5\u05e78",
            "шщъы",
            // 9
            //"\u05e1\u05e2\u05e4\u05e39"
            "ьэюя"
        };

        Hashtable values = new Hashtable();
        for(int iter = 0 ; iter < LOWER_CASE_KEY_CODES.length ; iter++)
        {
            values.put(new Integer('0' + iter), LOWER_CASE_KEY_CODES[iter]);
        }
        TextField.addInputMode("абв", values, false);
        
        final String[] UPPER_CASE_KEY_CODES = {
            // 0
            " +0",
            // 1
            ".,?!'\"1-()@/:_",
            // 2
            //"\u05d3\u05d4\u05d52",
            "АБВГ",
            // 3
            //"\u05d0\u05d1\u05d23",
            "ДЕЖЗ",
            // 4
            //"\u05de\u05dd\u05e0\u05df4",
            "ИЙКЛ",
            // 5
            //"\u05d9\u05db\u05da\u05dc5",
            "МНОП",
            // 6
            //"\u05d6\u05d7\u05d86",
            "РСТУ",
            // 7
            //"\u05e8\u05e9\u05ea7",
            "ФХЦЧ",
            // 8
            //"\u05e6\u05e5\u05e78",
            "ШЩЪЫ",
            // 9
            //"\u05e1\u05e2\u05e4\u05e39"
            "ЬЭЮЯ"
        };
        
        values = new Hashtable();
        for(int iter = 0 ; iter < UPPER_CASE_KEY_CODES.length ; iter++)
        {
            values.put(new Integer('0' + iter), UPPER_CASE_KEY_CODES[iter]);
        }
        TextField.addInputMode("АБВ", values, false);
    }
}
